///////////////////////////////////////////////////////////////////////////////
///
/// Cylan Client Core
/// Copyright (C) Shenzhen Cylan Tech. Co., Ltd. 2012
///
/// @file       ICABResource.h
/// @brief      ICAB资源相关API
///
///////////////////////////////////////////////////////////////////////////////
#ifndef ICAB_RESOURCE_H
#define ICAB_RESOURCE_H

#ifdef __cplusplus
extern "C"{
#endif

#include "Core/Core.h"

/**
 * @struct ICAB_RESOURCE
 * @brief ICAB资源信息
 */
typedef struct ICAB_RESOURCE
{
    int ID;                         ///< ICAB资源ID
    const char *Name;               ///< ICAB资源名称
    int Weight;                     ///< ICAB资源排序权重
    const char *Desc;               ///< ICAB资源描述
    int isHidden;                   ///< ICAB资源是否隐藏,0不隐藏,1隐藏，独立客户端
	int hidden_mobile;              ///< ICAB资源是否隐藏,0不隐藏,1隐藏，移动客户端
    int isPopup;                    ///< 是否自动弹出资源
    const char *Icon;               ///< ICAB图标地址
    int IconCreateTime;             ///< 图标创建时间    
    int isUseTunnel;                ///< 是否使用隧道
    const char *TunnelType;         ///< 隧道类型
    const char *Username;           ///< iServer登录用户
    const char *Password;           ///< iServer登录密码
    int SessionKeepTime;            ///< ICAB会话保留时间
    const char *WorkDir;            ///< ICAB资源主程序工作目录
    const char *Program;            ///< ICAB资源主程序
    const char *ViewGroup;          ///< ICAB资源所属组
    int isForceSettings;            ///< ICAB显示强制使用服务器配置
    int isFullScreen;               ///< ICAB全屏显示
    int Width;                      ///< ICAB显示宽度
    int Height;                     ///< ICAB显示高度
    int ColorDepth;                 ///< ICAB显示颜色深度
    const char *SsoUsername;        ///< 单点登录用户名
    const char *SsoPassword;        ///< 单点登录密码
    int SsoID;                      ///< 单点登陆配置模板ID
    int SsoExist;                   ///< 当前用户单点登陆配置已经存在
    const char *Domain;             ///< iServer登录域
    int VerticalDisplayFlag;        ///< ICAB横屏竖屏显示模式
    const char *BGWorkdir1;         ///< 辅助应用1工作目录
    const char *BGProgram1;         ///< 辅助应用1启动程序
    const char *BGWorkdir2;         ///< 辅助应用2工作目录
    const char *BGProgram2;         ///< 辅助应用2启动程序
    const char *BGWorkdir3;         ///< 辅助应用3工作目录
    const char *BGProgram3;         ///< 辅助应用3启动程序
    int HandWrittenEnable;          ///< ICAB是否启用手写签批,0不开启,1开启

    // 向前兼容
    int UseHostDefaultUser;
    int isRemoteApp;
    const char *Param;              ///< 运行参数
} ICAB_RESOURCE;


/**
 * @struct ICAB_RESOURCE
 * @brief IServer信息
 */
typedef struct ICAB_HOST
{
    int ID;                         ///< IServer ID
    const char *Name;               ///< IServer名称
    const char *Addr;               ///< IServer地址
    int Port;                       ///< IServer CSMP端口
    int RdpPort;                    ///< IServer RDP端口
    int XrdpPort;                   ///< IServer XRDP端口
    int isAccessible;               ///< IServer 是否在线?
    const char *RedirectDriver;     ///< IServer 重定向盘符
    int RedirectPrinter;            ///< IServer 重定向打印机
    int RedirectCOM;                ///< IServer 重定向COM口
    int SharePrinter;               ///< ?
    int KeyboardHookRemote;         ///< ?

    // 向前兼容?
    const char *Username;
    const char *Password;
    const char *Domain;

    int Width;
    int Height;
    int ColorDepth;
    int FullScreen;
    int ForceSettings;
} ICAB_HOST;

/**
 * @fn int ICABResourceCount(const CHANDLE Session)
 * @brief 返回会话可用的ICAB资源个数
 * @param Session 已登陆的Session句柄
 * @return 可用的ICAB资源数量
 */
int ICABResourceCount(const CHANDLE Session);


/**
 * @fn CC_STATUS ICABResourceInfo(const CHANDLE Session, int Index, ICAB_RESOURCE *Resource, int *Size)
 * @brief 获取ICAB资源信息
 * @param Session 已登陆的Session句柄
 * @param Index 资源索引
 * @param Resource 调用者提供的缓冲区以保存资源信息
 * @param Size Resource参数的缓冲区大小. 如果提供的缓冲区太小, 会返回所需的缓冲区大小字节数.
 * @return ICAB资源信息
 * @retval ERR_SUCCESS 成功
 * @retval ERR_NOT_FOUND 资源索引超出可用资源个数范围
 * @retval ERR_BUFFER_TOO_SMALL 提供的Resource缓冲区太小
 */
CC_STATUS ICABResourceInfo(const CHANDLE Session, int Index, ICAB_RESOURCE *Resource, int *Size);

/**
 * @fn CC_STATUS ICABGetSsoSettingUrl(const CHANDLE Session, char *pSsoSettingUrl, int *Size)
 * @brief 获取ICAB资源的SSO配置地址
 * @param Session 已登陆的Session句柄
 * @param SsoID 单点登陆模版ID 
 * @param pSsoSettingUrl 调用者提供的缓冲区以保存url地址
 * @param Size pSsoSettingUrl参数的缓冲区大小. 如果提供的缓冲区太小, 会返回所需的缓冲区大小字节数.
 * @retval ERR_SUCCESS 成功
 * @retval ERR_NOT_FOUND 没有找到SSO配置地址
 * @retval ERR_BUFFER_TOO_SMALL 提供的pSsoSettingUrl缓冲区太小
 */
CC_STATUS ICABGetSsoSettingUrl(const CHANDLE Session, int SsoID, char *pSsoSettingUrl, int *Size);

/**
 * @fn CC_STATUS ICABGetHttpsBaseUrl(const CHANDLE Session, char *pHttpBaseUrl, int *Size)
 * @brief 获取SGA路径
 * @param Session 已登陆的Session句柄
 * @param SsoID 单点登陆模版ID 
 * @param pSsoSettingUrl 调用者提供的缓冲区以保存url地址
 * @param Size pSsoSettingUrl参数的缓冲区大小. 如果提供的缓冲区太小, 会返回所需的缓冲区大小字节数.
 * @retval ERR_SUCCESS 成功
 * @retval ERR_NOT_FOUND 没有找到SSO配置地址
 * @retval ERR_BUFFER_TOO_SMALL 提供的pSsoSettingUrl缓冲区太小
 */
CC_STATUS ICABGetHttpsBaseUrl(const CHANDLE Session, int SsoID, char *pHttpBaseUrl, int *Size); 
 
CC_STATUS ICABQueryHostNameByICABName(const CHANDLE Session, const char *ICABName, const char **HostName);

CC_STATUS ICABQueryHostByName(const CHANDLE Session, const char *HostName, ICAB_HOST *HostInfo);

#ifdef __cplusplus
}
#endif

#endif /* ICAB_RESOURCE_H */